package br.com.sgi.model;

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name="MEMBRO", schema="SGI")
@NamedQuery(
	    name="buscarClienteByParans",
	    query="SELECT n FROM Membro n " +
	    	  "WHERE lower(n.nome) like:nome"
	)
public class Membro {
	
	@Id
	@Column(name="CO_SEQ_MEMBRO")
//	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "seq_membro_seqmembro")  
//	@SequenceGenerator(name = "seq_membro_seqmembro", sequenceName = "SGI.seq_membro") 
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long coSeqMembro;
	
	
	@NotNull
	@Size(max=100)
	private String nome;
	
	@Column(name="dt_NASCIMENTO")
	@NotNull	
	private Date dtNascimento;
	
	@NotNull
	@Size(max=2)
	private String sexo;
	
	@Column(name="ESTADO_CIVIL")
	@NotNull
	@Size(max=15)
	private String estadoCivil;
	
	@Size(max=100)
	private String logradouro;
	
	private Integer numero;
	
	@Size(max=100)	
	private String complemento;
	
	@Size(max=100)
	private String bairro;
	
	@Size(max=60)
	private String cidade;
			
	@Size(max=2)
	private String uf;
	
	@Size(max=25)
	private String cep;
	
	@Size(max=100)
	private String naturalidade;
	
	@Column(name="UF_NATURALIDADE")	
	@Size(max=2)
	private String ufNaturalidade;
	
		
	@Size(max=30)
	private String nascionalidade;
	
		
	@Size(max=15)
	private String rg;
	
	@Size(max=11)
	private String cpf;
	
	@Size(max=25)
	private String telefone;
	
		
	@Size(max=25)
	private String celular;
	
	
	@Column(name="TELEFONE_EMPRESA")	
	@Size(max=25)
	private String telefoneEmpresa;
	
		
	@Size(max=100)
	private String email;
	
	@Column(name="GRAU_INSTRUCAO")	
	private String grauDeInstrucao;
	
	@Size(max=100)
	private String profissao;
	
	@Column(name="TIPO_SANGUINEO")	
	@Size(max=3)
	private String tipoSanguineo;
	
	//Dados familiares
	
	@Column(name="NO_PAI")	
	@Size(max=100)
	private String noPai;
	
	@Column(name="NO_MAE")	
	@Size(max=100)
	private String noMae;
	
	@Column(name="DT_CASAMENTO")	
	private Date dtCasamento;
	
	@Column(name="NO_CONJUGE")	
	@Size(max=100)
	private String noConjuge;
	
	@Column(name="NU_FILHOS")	
	private Long nuFilhos;
	
	//Dados ministeriais
	
	// Dados Transferencia
	@Column(name="TIPO_ADIMISSAO" )	
	@Size(max=3)
	private String tipoAdmissao;
	
	@Column(name="DT_BATISMO_ANTES" )
	private Date dtBatismoAntes;
	
	@Size(max=60)
	@Column(name="LOCAL_BATISMO" )
	private String localBatismo;
	
	@Column(name="PR_OFICIANTE")	
	@Size(max=100)
	private String prOficiante;
	
	@Column(name="NO_IGREJA_TRANSF")	
	@Size(max=100)
	private String noIgrejaTransferencia;
	
	@OneToMany(mappedBy="membro",  fetch = FetchType.EAGER, cascade={CascadeType.ALL})
	private List<MembroFuncao> membroFuncaoAnterior;
	
	
	@Column(name="CONSAGRACAO_MINISTERIAL_ANTES")	
	@Size(max=2)
	private String consagracaoMinisterialAntes;
	
	@Column(name="DT_CONS_MINISTERIAL_ANTES")	
	private Date dtConsMinisterialAntes;
	
	
	
	
	@Column(name="SITUACAO_CADASTRO")	
	@Size(max=2)
	private String situacaoCadastro;
	
	
	//Dados conversao
	
	@Column(name="DT_CONVERSAO")	
	private Date dtConversao;
	
	@Column(name="DT_BATISMO")	
	private Date dtBatismo;
	
	@Column(name="CONSAGRACAO_MINISTERIAL")	
	@Size(max=2)	
	private String consagracaoMinisterial;
	
	@Column(name="DT_CONS_MINIST")	
	private Date dtConsagracaoMinist;
	
	@NotNull
	@ManyToOne
	@JoinColumn(name="CO_SEQ_IGREJA")
	private Igreja igrejaFrequecia;
	
		
	@OneToMany(mappedBy="membro",  fetch = FetchType.EAGER, cascade={CascadeType.ALL})
	private List<MembroFuncao> membroFuncaoAtual;
	
	@OneToMany(mappedBy="membro",  fetch = FetchType.EAGER, cascade={CascadeType.ALL})
	private List<MembroFuncao> membroFuncaoPretendida;
	
	//Dados gerais
	@Column(name="ORIGEM_RELIGIOSA")	
	@Size(max=2)
	private String origemReligiosa;
	

	
	
	public Long getCoSeqMembro() {
		return coSeqMembro;
	}

	public void setCoSeqMembro(Long coSeqMembro) {
		this.coSeqMembro = coSeqMembro;
	}
	
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getSexo() {
		return sexo;
	}

	public void setSexo(String sexo) {
		this.sexo = sexo;
	}

	public String getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(String estadoCivil) {
		this.estadoCivil = estadoCivil;
	}


	public String getNaturalidade() {
		return naturalidade;
	}

	public void setNaturalidade(String naturalidade) {
		this.naturalidade = naturalidade;
	}

	public String getUfNaturalidade() {
		return ufNaturalidade;
	}

	public void setUfNaturalidade(String ufNaturalidade) {
		this.ufNaturalidade = ufNaturalidade;
	}

	public String getNascionalidade() {
		return nascionalidade;
	}

	public void setNascionalidade(String nascionalidade) {
		this.nascionalidade = nascionalidade;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}


	public String getGrauDeInstrucao() {
		return grauDeInstrucao;
	}

	public void setGrauDeInstrucao(String grauDeInstrucao) {
		this.grauDeInstrucao = grauDeInstrucao;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getCelular() {
		return celular;
	}

	public void setCelular(String celular) {
		this.celular = celular;
	}

	public String getTelefoneEmpresa() {
		return telefoneEmpresa;
	}

	public void setTelefoneEmpresa(String telefoneEmpresa) {
		this.telefoneEmpresa = telefoneEmpresa;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getProfissao() {
		return profissao;
	}

	public void setProfissao(String profissao) {
		this.profissao = profissao;
	}

	public String getTipoSanguineo() {
		return tipoSanguineo;
	}

	public void setTipoSanguineo(String tipoSanguineo) {
		this.tipoSanguineo = tipoSanguineo;
	}

	public String getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(String logradouro) {
		this.logradouro = logradouro;
	}

	public String getBairro() {
		return bairro;
	}

	public void setBairro(String bairro) {
		this.bairro = bairro;
	}

	public String getComplemento() {
		return complemento;
	}

	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}

	public String getCidade() {
		return cidade;
	}

	public void setCidade(String cidade) {
		this.cidade = cidade;
	}

	public String getUf() {
		return uf;
	}

	public void setUf(String uf) {
		this.uf = uf;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getNoPai() {
		return noPai;
	}

	public void setNoPai(String noPai) {
		this.noPai = noPai;
	}

	public String getNoMae() {
		return noMae;
	}

	public void setNoMae(String noMae) {
		this.noMae = noMae;
	}



	public String getNoConjuge() {
		return noConjuge;
	}

	public void setNoConjuge(String noConjuge) {
		this.noConjuge = noConjuge;
	}

	public Long getNuFilhos() {
		return nuFilhos;
	}

	public void setNuFilhos(Long nuFilhos) {
		this.nuFilhos = nuFilhos;
	}

	public String getTipoAdmissao() {
		return tipoAdmissao;
	}

	public void setTipoAdmissao(String tipoAdmissao) {
		this.tipoAdmissao = tipoAdmissao;
	}

	public Date getDtCasamento() {
		return dtCasamento;
	}

	public void setDtCasamento(Date dtCasamento) {
		this.dtCasamento = dtCasamento;
	}

	public String getLocalBatismo() {
		return localBatismo;
	}

	public void setLocalBatismo(String localBatismo) {
		this.localBatismo = localBatismo;
	}



	public String getNoIgrejaTransferencia() {
		return noIgrejaTransferencia;
	}

	public void setNoIgrejaTransferencia(String noIgrejaTransferencia) {
		this.noIgrejaTransferencia = noIgrejaTransferencia;
	}


	public Date getDtConsMinisterialAntes() {
		return dtConsMinisterialAntes;
	}

	public void setDtConsMinisterialAntes(Date dtConsMinisterialAntes) {
		this.dtConsMinisterialAntes = dtConsMinisterialAntes;
	}

	public String getSituacaoCadastro() {
		return situacaoCadastro;
	}

	public void setSituacaoCadastro(String situacaoCadastro) {
		this.situacaoCadastro = situacaoCadastro;
	}

	public Date getDtConversao() {
		return dtConversao;
	}

	public void setDtConversao(Date dtConversao) {
		this.dtConversao = dtConversao;
	}

	public Date getDtBatismo() {
		return dtBatismo;
	}

	public void setDtBatismo(Date dtBatismo) {
		this.dtBatismo = dtBatismo;
	}


	public Igreja getIgrejaFrequecia() {
		return igrejaFrequecia;
	}

	public void setIgrejaFrequecia(Igreja igrejaFrequecia) {
		this.igrejaFrequecia = igrejaFrequecia;
	}

	
	public String getConsagracaoMinisterial() {
		return consagracaoMinisterial;
	}

	public void setConsagracaoMinisterial(String consagracaoMinisterial) {
		this.consagracaoMinisterial = consagracaoMinisterial;
	}

	public String getOrigemReligiosa() {
		return origemReligiosa;
	}

	public void setOrigemReligiosa(String origemReligiosa) {
		this.origemReligiosa = origemReligiosa;
	}

	public Date getDtNascimento() {
		return dtNascimento;
	}

	public void setDtNascimento(Date dtNascimento) {
		this.dtNascimento = dtNascimento;
	}

	public Date getDtBatismoAntes() {
		return dtBatismoAntes;
	}

	public void setDtBatismoAntes(Date dtBatismoAntes) {
		this.dtBatismoAntes = dtBatismoAntes;
	}

	public String getPrOficiante() {
		return prOficiante;
	}

	public void setPrOficiante(String prOficiante) {
		this.prOficiante = prOficiante;
	}

	public String getConsagracaoMinisterialAntes() {
		return consagracaoMinisterialAntes;
	}

	public void setConsagracaoMinisterialAntes(String consagracaoMinisterialAntes) {
		this.consagracaoMinisterialAntes = consagracaoMinisterialAntes;
	}

	
	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public Integer getNumero() {
		return numero;
	}

	public void setNumero(Integer numero) {
		this.numero = numero;
	}

	public Date getDtConsagracaoMinist() {
		return dtConsagracaoMinist;
	}

	public void setDtConsagracaoMinist(Date dtConsagracaoMinist) {
		this.dtConsagracaoMinist = dtConsagracaoMinist;
	}

	public List<MembroFuncao> getMembroFuncaoAnterior() {
		return membroFuncaoAnterior;
	}

	public List<MembroFuncao> getMembroFuncaoAtual() {
		return membroFuncaoAtual;
	}

	public void setMembroFuncaoAtual(List<MembroFuncao> membroFuncaoAtual) {
		this.membroFuncaoAtual = membroFuncaoAtual;
	}

	public void setMembroFuncaoAnterior(List<MembroFuncao> membroFuncaoAnterior) {
		this.membroFuncaoAnterior = membroFuncaoAnterior;
	}

	public List<MembroFuncao> getMembroFuncaoPretendida() {
		return membroFuncaoPretendida;
	}

	public void setMembroFuncaoPretendida(List<MembroFuncao> membroFuncaoPretendida) {
		this.membroFuncaoPretendida = membroFuncaoPretendida;
	}
	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result	+ ((coSeqMembro == null) ? 0 : coSeqMembro.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Membro other = (Membro) obj;
		if (coSeqMembro == null) {
			if (other.coSeqMembro!= null)
				return false;
		} else if (!coSeqMembro.equals(other.coSeqMembro))
			return false;
		return true;
	}
	
	
	}
